#ifndef REGISTRO_H_
#define REGISTRO_H_

#include "Componente.h"
#include "Clave.h"

#include "Dato.h"

namespace Toolkit
{

class Registro : public Componente
{
public:
    Registro(const TipoSerializacion);
    virtual ~Registro();

    void setDato(Dato *dato);
    /**
     * Devuelve true si la clave del dato registro es menor a la pasada.
     * */
    virtual bool operator <(const Clave&) const;
    /**
     * Devuelve true si la clave pasada coincide con la del registro.
     * */
    virtual bool operator ==(const Clave&) const;

    virtual void serializar(stringstream&) const;
    virtual void hidratar(stringstream&);

    /**
     * Hidrata el dato pasado a partir de aquel que
     * está almacenado en el registro.
     **/
    void hidratarDato(Dato &dato);

    virtual char getTipo() const;
    virtual bool tieneDato() const;

    virtual Dato* getDato() const;

protected:
    virtual void especializacionSerializar(stringstream&) const = 0;
    virtual void especializacionHidratar(stringstream&) = 0;

private:
    Dato *dato;
};

}

#endif /* REGISTRO_H_ */
